#include "user_scheduler.h"
uint8_t task_num;//任务数量

/*任务结构体定义*/
typedef struct{
    void(*task_func)(void);//任务函数
    uint32_t rate_ms;//任务执行周期
    uint32_t last_run;//上一次执行时间
}task_t;
uint8_t key_read(void)
{
    uint8_t temp = 0;
    if(HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_1) == GPIO_PIN_RESET)
        temp = 1;
    return temp;
}
uint8_t key_val,key_down,key_old;
uint16_t time_set = 1000;
void key_task(void)
{
    key_val = key_read();
    key_down = key_val & (key_old ^ key_val);
    key_old = key_val;
    if(key_down == 1)
    {
        user_switch ^= 1;
    }
}
/*任务数组定义*/
task_t scheduler_task[] = {
    {adc_task,1,0},
    {user_display_function,30},
    {uart_task,5,0},
    {key_task,10,0}
};
/**
 * @brief 调度器初始化函数
 * @param none
 * @return none
 */
void scheduler_init(void)
{
    //任务数量获取
    user_printf(&huart1,"init\r\n");
    task_num = sizeof(scheduler_task)/sizeof(task_t);
}
/**
 * @brief 调度器运行函数
 * @param none
 * @return none
 */
void scheduler_run(void)
{
    //轮询读取任务
    for(uint8_t i = 0;i < task_num;i++)
    {
        //获取当前系统时间
        uint32_t now_time = HAL_GetTick();
        //判断是否到达任务执行时间
        if(now_time >= scheduler_task[i].rate_ms + scheduler_task[i].last_run)
        {
            //更新上一次执行时间
            scheduler_task[i].last_run = now_time;
            //执行当前任务
            scheduler_task[i].task_func();
        }
    }
}

